package com.controller;
import com.dto.DTO;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;

/****
 * 用户登录Controller
 *
 * @author Swinglife
 *
 */
@RestController
public class LoginController {

	@Resource
	EnterpriseCacheSessionDAO sessionDao;

//	@GetMapping(value = "/")
//	public DTO home(Model model){
//		System.out.println("默认根目录");
//		DTO dto = new DTO(302,"登录成功","home");
//		return dto;
//	}
	/***
	 * 告诉用户跳转到登录页面
	 *
	 * @return
	 */
	@GetMapping(value = "/login")
	public DTO show(Model model){
		DTO dto = new DTO(302, "login.html");
		return dto;
	}

	/**
	 *
	 * @param username
	 * @param password
	 * @param rememberMe
	 * @param modelName  传递当前是什么模块的用户登录 例如 会员 member 自定义的realm 需要知道调用什么的service 要靠这个 字符串
	 * @return
	 */
	@PostMapping(value = "/login")
	public DTO Login(String username, String password, String rememberMe, String modelName) {
		System.out.println(username + "--------------------1111 " + password + " " + rememberMe + "  ----- " + modelName);

		Subject subject = SecurityUtils.getSubject();//通过安全工具 得到一个子项目
//令牌 账号密码令牌   根据mac地址等硬件算出特殊字符串 私人令牌   公钥 私钥
        subject.getSession().setAttribute("modelName",modelName);//此处存放的字符串 realm要用
		UsernamePasswordToken token = new UsernamePasswordToken();
		token.setUsername(username);
		token.setPassword(password.toCharArray());
//		token.setModelName(modelName);

		//禁止已登录用户
//		Collection<Session> sessions = sessionDao.getActiveSessions();
//        for (Session session : sessions) {
//
//            System.out.println("登录用户" + session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY));
//            if (session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY) != null) {
//                return  new ModelAndView("accountlogin", "msg", "该用户已登录");
//            }
//        }



		boolean remembermeRusult = rememberMe == null ? false : true; // null=>false
		if (remembermeRusult) {// 如果用户提交的remmbermeResult为true 保存到令牌中
			token.setRememberMe(remembermeRusult);
		}
		String error = null;
		try {
			subject.login(token);//子项目登录  登录正确就会报异常
		} catch (UnknownAccountException e) {
			error = "用户名错误";
		} catch (IncorrectCredentialsException e) {
			error = "用户名/密码错误";
		} catch (ExcessiveAttemptsException e) {
			// TODO: handle exception
			error = "登录失败多次，账户锁定10分钟";
		} catch (AuthenticationException e) {
			// 其他错误，比如锁定，如果想单独处理请单独catch处理
			e.printStackTrace();
			error = "其他错误：" + e.getMessage();
		}
		DTO dto = new DTO();
		dto.setCode(200);//重定向 原来资源还在
		System.out.println("登录出错出错信息为;"+error);

		if (error != null) {// 出错了，返回登录页面
            dto.setMsg(error);
			dto.setUrl("accountlogin");
		} else {// 登录成功
			System.out.println("0000000000000999"+subject.getSession().getAttribute("user"));
			dto.setMsg("登录成功1");
			dto.setUrl("home");
			dto.setT(subject.getSession().getAttribute("user"));
		}
        return dto;
	}


	@RequestMapping("/logout")
	public void logout(HttpServletResponse response) {
		Subject lvSubject=SecurityUtils.getSubject();
		lvSubject.logout();
		response.setStatus(302);
		//response.setStatusCode(HttpStatus.FOUND);
	}



}